package com.hollis公众号.为什么说Java中只有值传递;

import com.externalizable.demo1.User;

public class ObjectRightDemo {

	/**
	当我们在main中创建一个User对象的时候，在堆中开辟一块内存，其中保存了name和gender等数据。然后hollis持有该内存的地址0x123456（图1）。
	当尝试调用pass方法，并且hollis作为实际参数传递给形式参数user的时候，会把这个地址0x123456交给user，这时，user也指向了这个地址（图2）。
	然后在pass方法内对参数进行修改的时候，即user = new User();，会重新开辟一块0X456789的内存，赋值给user。后面对user的任何修改都不会改变内存0X123456的内容（图3）。
	上面这种传递是什么传递？肯定不是引用传递，如果是引用传递的话，在执行user = new User();的时候，实际参数的引用也应该改为指向0X456789，但是实际上并没有。
	通过概念我们也能知道，这里是把实际参数的引用的地址复制了一份，传递给了形式参数。所以，上面的参数其实是值传递，把实参对象引用的地址当做值传递给了形式参数。

	那么，既然这样，为啥上面同样是传递对象，传递的String对象和User对象的表现结果不一样呢？我们在pass方法中使用name = "hollischuang";试着去更改name的值，阴差阳错的直接改变了name的引用的地址。因为这段代码，会new一个String，再把引用交给name，即等价于：
	name = new String("hollischuang");
	而原来的那个"Hollis"字符串还是由实参持有着的，所以，并没有修改到实际参数的值。
	 * @param args
	 */
	public static void main(String[] args) {
		ObjectRightDemo pt = new ObjectRightDemo();

		User hollis = new User();
		hollis.setName("Hollis");
		hollis.setAge(10);
		pt.pass(hollis);
		System.out.println("print in main , user is " + hollis);
	}

	public void pass(User user) {
		user = new User();
		user.setName("hollischuang");
		user.setAge(22);
		System.out.println("print in pass , user is " + user);
	}

}
